#include <iostream>
#include <vector>
#include "Thread.hpp"
#include "Mutex.hpp"

using namespace ThreadModule;
using namespace MutexModule;

int ticketnum = 10000;
Mutex mutex;
#define NUM 4

class ThreadData
{
public:
    std::string name;
};

void Ticket(ThreadData &td)
{
    // 使用共享资源的代码块
    while (true)
    {
        //临时变量，处理作用域就会销毁
        //这个类的初始化就是加锁，销毁就是解锁，实现对锁的保护
        LockGuard guard(mutex);
        if (ticketnum > 0)
        {
            //usleep(1000);

            // 1.抢票
            printf("get a new ticket : id : %d\n", ticketnum--);

            // 2.入库模拟
            // usleep(1000);
        }
        else
        {
            break;
        }
    }
}
int main()
{
    // 1. 构建线程对象
    std::vector<Thread<ThreadData>> threads;

    for (int i = 0; i < NUM; i++)
    {
        ThreadData *td = new ThreadData();

        // 直接在 threads 向量的末尾构造一个 Thread<ThreadData> 对象构造时使用提供的参数（Ticket 函数和 *td 对象）
        // 避免了先创建临时 Thread 对象再拷贝 / 移动到容器中的开销
        // 和push_back类似，但 emplace_back 更加高效
        threads.emplace_back(Ticket, *td);
        td->name = threads.back().Name();
    }

    // 2. 启动线程
    for (auto &thread : threads)
    {
        thread.Start();
    }

    // 3. 等待线程
    for (auto &thread : threads)
    {
        thread.Join();
    }

    return 0;
}